package main

import (
	"fmt"
	"net/http"
	"sync"
	"time"
)

// TODO 模拟下载文件的函数
func downloadFile(url string, wg *sync.WaitGroup, ch chan<- string) {
	defer wg.Done() // 确保在函数结束时调用 Done

	// 模拟下载延迟
	time.Sleep(2 * time.Second)

	// 发起 HTTP 请求
	response, err := http.Get(url)
	if err != nil {
		ch <- fmt.Sprintf("Error downloading %s: %v", url, err)
		return
	}
	defer response.Body.Close()

	// 模拟处理响应
	ch <- fmt.Sprintf("Downloaded %s with status %s", url, response.Status)
}

func main() {
	var wg sync.WaitGroup
	urlList := []string{
		"https://example.com/file1",
		"https://example.com/file2",
		"https://example.com/file3",
	}

	// 创建一个通道用于接收下载结果
	results := make(chan string, len(urlList))

	// 启动并发下载任务
	for _, url := range urlList {
		wg.Add(1)
		go downloadFile(url, &wg, results)
	}

	// 启动一个 goroutine 来关闭通道
	go func() {
		wg.Wait()      // 等待所有下载任务完成
		close(results) // 关闭结果通道
	}()

	// 处理下载结果
	for result := range results {
		fmt.Println(result)
	}
}
